package com.sixth.system.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sixth.core.annotation.OperaLog;
import com.sixth.core.entity.Menu;
import com.sixth.core.vo.R;
import com.sixth.system.service.MenuService;
import com.sixth.system.vo.MenuVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 菜单管理控制器
 *
 * @author 闫克起
 * @date Created in 11:58 2024/8/12
 * @description 提供菜单管理相关的API接口
 */
@Api(tags = "菜单管理")
@RestController
@RequestMapping("system/menu")
public class MenuController {
    @Autowired
    private MenuService menuService;

    /**
     * 根据用户ID获取菜单列表
     * @param userId 用户ID
     * @return 菜单列表
     */
    @ApiOperation(value = "根据用户ID获取菜单列表", notes = "查询与用户ID关联的菜单项")
    @GetMapping("/getByUserId/{userId}")
    public R<List<Menu>> getByUserId(@PathVariable Long userId) {
        return menuService.selectByUserId(userId);
    }

    /**
     * 根据角色ID查询当前角色拥有的哪些菜单权限
     * @param roleId 角色ID
     * @return 当前角色拥有的菜单权限列表
     */
    @ApiOperation(value = "根据角色ID查询菜单权限", notes = "查询与角色ID关联的菜单权限")
    @GetMapping("/selectMenusByRoleId/{roleId}")
    public R<List<Menu>> selectMenusByRoleId(@PathVariable Long roleId) {
        return menuService.selectMenusByRoleId(roleId);
    }

    /**
     * 保存角色和菜单之间的关系
     * @param roleId 角色ID
     * @param finalKey 菜单ID数组
     * @return 操作结果
     */
    @ApiOperation(value = "保存角色和菜单的关系", notes = "保存角色与多个菜单的关系")
    @GetMapping({"/saveRoleMenu/{roleId}", "/saveRoleMenu/{roleId}/{finalKey}"})
    public R saveRoleMenu(@PathVariable Long roleId, @PathVariable(required = false) String finalKey) {
        Long[] finalKeyArray = null;
        if (finalKey != null && !finalKey.isEmpty()) {
            finalKeyArray = Arrays.stream(finalKey.split(","))
                    .map(Long::parseLong)
                    .toArray(Long[]::new);
        }
        return menuService.saveRoleMenu(roleId, finalKeyArray);
    }
    /**
     * 获取左侧菜单
     * @return 左侧菜单列表
     */
    @ApiOperation(value = "获取左侧菜单", notes = "获取左侧导航栏的菜单列表")
    @GetMapping("/leftMenu")
    public R<List<Menu>> leftMenu() {
        return menuService.selectLeftMenu();
    }

    /**
     * 查询所有菜单
     * @param menuVo 查询条件
     * @return 所有菜单列表
     */
    @ApiOperation(value = "查询所有菜单", notes = "根据查询条件查询所有菜单")
    @PostMapping("/listAll")
    public R<List<Menu>> list(@RequestBody MenuVo menuVo) {
        return menuService.selectAll(menuVo);
    }

    /**
     * 查询所有菜单（用于角色模块分配权限）
     * @return 所有菜单列表
     */
    @ApiOperation(value = "查询所有菜单（用于角色模块分配权限）", notes = "查询所有菜单以供角色模块分配权限使用")
    @GetMapping("/listAllMenu")
    public R<List<Menu>> listAllMenu() {
        return menuService.listAllMenu();
    }

    /**
     * 添加或更新菜单
     * @param menu 菜单信息
     * @return 操作结果
     */
    @ApiOperation(value = "添加或更新菜单", notes = "添加或更新菜单信息")
    @OperaLog(value = "添加或更新菜单", type = 2)
    @PostMapping("/add_update_menu")
    public boolean add_update_menu(@RequestBody Menu menu) {
        return menuService.add_update_menu(menu);
    }

    /**
     * 根据menuId查询一个菜单
     * @param menuId 菜单ID
     * @return 菜单信息
     */
    @ApiOperation(value = "根据menuId查询一个菜单", notes = "根据菜单ID查询单个菜单")
    @GetMapping("/getByMenuId/{menuId}")
    public R<Menu> getById(@PathVariable Long menuId) {
        return menuService.getMenuById(menuId);
    }

    /**
     * 根据menuId删除菜单
     * @param menuId 菜单ID
     * @return 删除结果
     */
    @ApiOperation(value = "根据menuId删除菜单", notes = "根据菜单ID删除菜单")
    @OperaLog(value = "删除菜单", type = 3)
    @DeleteMapping("/deleteByMenuId/{menuId}")
    public R deleteByMenuId(@PathVariable Long menuId) {
        return menuService.removeById(menuId);
    }
}
